﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AudiPyme.DAL
{
    public class InstanciaTipactVulnInformeFactory
    {
        //Método que saca las instancias Tipo Activo - Vulnerabilidades actuales de una empresa y los inserta en su tabla de Informe
        public static bool InsertaInstTipactVulnInforme(int IdEmpresa, int IdInforme)
        {
            try
            {
                //Valor de la ejecucion si todo va bien
                bool ok = true;
                ModeloContainer agenteBD = new ModeloContainer();
                List<InstanciaTiposActivosVulnerabilidades> InstTVEmp = (from ITACE in agenteBD.InstanciaTiposActivosVulnerabilidadesEstablecer
                                                                         where ITACE.IdEmpresa == IdEmpresa && ITACE.Actual == true
                                                                         select ITACE).ToList();
                if (InstTVEmp.Count == 0)
                {
                    //No se recogieron controles se devuelve un valor de error
                    ok = false;
                    return ok;
                }
                else
                {
                    foreach (InstanciaTiposActivosVulnerabilidades Instancia in InstTVEmp)
                    {
                        InstanciaTipactVulnInforme nuevaInstancia = new InstanciaTipactVulnInforme();
                        nuevaInstancia.IdInforme = IdInforme;
                        nuevaInstancia.IdEmpresa = Instancia.IdEmpresa;
                        nuevaInstancia.IdTipoActivo = Instancia.IdTipoActivo;
                        nuevaInstancia.IdVulnerabilidad = Instancia.IdVulnerabilidad;
                        agenteBD.AddToInstanciaTipactVulnInformeEstablecer(nuevaInstancia);
                    }
                    agenteBD.SaveChanges();
                    return ok;
                }
            }
            catch (Exception e)
            {
                e.ToString();
                return false;
            }
        }

        //Método que recoge el número de relaciones Tipo Activo - Vulnerabilidad actuales de una empresa
        public static int NumRelacTipActVulnInforme(int IdInforme)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            int nRelac = (from InstTipAmenVuln in agenteBD.InstanciaTipactVulnInformeEstablecer
                          where InstTipAmenVuln.IdInforme == IdInforme
                          select InstTipAmenVuln).Count();
            return nRelac;
        }


        //Relaciones Tipo Activo - Vulnerabilidad de un Informe por Tipo de Activo
        public static int NumRelacTipActVulnInformePorTipoActivo(int IdInforme, int IdTipoActivo)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            int NumRelaciones = (from Rel in agenteBD.InstanciaTipactVulnInformeEstablecer
                                 where Rel.IdInforme == IdInforme && Rel.IdTipoActivo == IdTipoActivo
                                 select Rel).Count();
            return NumRelaciones;
        }


        //Método que elimina de forma permanente, todos las relaciones de informe Tipo Activo - Vulnerabilidad
        //asociados a una empresa
        internal static void EliminaTotalInstanciasTipVuln(int IdEmpresa)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<InstanciaTipactVulnInforme> InstanciasEliminarQuery = from RelacInf in agenteBD.InstanciaTipactVulnInformeEstablecer
                                                                             join EmpInf in agenteBD.EmpresaInformeEstablecer on RelacInf.IdInforme equals EmpInf.IdInforme
                                                                             where EmpInf.IdEmpresa == IdEmpresa
                                                                             select RelacInf;
            if (InstanciasEliminarQuery.Count() != 0)
            {
                foreach (InstanciaTipactVulnInforme Instancia in InstanciasEliminarQuery)
                {
                    agenteBD.InstanciaTipactVulnInformeEstablecer.DeleteObject(Instancia);
                }
                agenteBD.SaveChanges();
            }
        }

        //Método que elimina de forma permanente, todos las relaciones de informe Tipo Activo - Vulnerabilidad
        //asociados a una lista de informes
        internal static void EliminaInstanciasTipVulnInformeInformes(List<int> LInformes)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<InstanciaTipactVulnInforme> InstanciasEliminarQuery = from RelacInf in agenteBD.InstanciaTipactVulnInformeEstablecer
                                                                             where LInformes.Contains(RelacInf.IdInforme)
                                                                             select RelacInf;
            if (InstanciasEliminarQuery.Count() != 0)
            {
                foreach (InstanciaTipactVulnInforme Instancia in InstanciasEliminarQuery)
                {
                    agenteBD.InstanciaTipactVulnInformeEstablecer.DeleteObject(Instancia);
                }
                agenteBD.SaveChanges();
            }
        }

        //Método que elimina de forma permanente, todos las relaciones de informe Tipo Activo - Vulnerabilidad
        //asociados a un informe
        internal static void EliminaInstanciasTipVulnInformeInforme(int IdInforme)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<InstanciaTipactVulnInforme> InstanciasEliminarQuery = from RelacInf in agenteBD.InstanciaTipactVulnInformeEstablecer
                                                                             where RelacInf.IdInforme == IdInforme
                                                                             select RelacInf;
            if (InstanciasEliminarQuery.Count() != 0)
            {
                foreach (InstanciaTipactVulnInforme Instancia in InstanciasEliminarQuery)
                {
                    agenteBD.InstanciaTipactVulnInformeEstablecer.DeleteObject(Instancia);
                }
                agenteBD.SaveChanges();
            }
        }


    }
}
